package org.example.managementsystem.service;

import org.example.managementsystem.model.Person;
import org.example.managementsystem.repository.PersonDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 人员信息服务层
 */
@Service
public class PersonService {
    private final PersonDao personDao;

    @Autowired
    public PersonService(PersonDao personDao) {
        this.personDao = personDao;
    }

    /**
     * 添加人员
     */
    public Person addPerson(Person person) {
        // 确保工号为空，以便后续自动生成
        person.setJobNumber(null);
        
        // 先插入获取ID
        Long id = personDao.insertPerson(person);
        person.setId(id);
        
        // 根据部门和ID生成工号
        String deptAbbr = getDepartmentAbbr(person.getDepartment());
        String jobNumber = deptAbbr + id;
        person.setJobNumber(jobNumber);
        
        // 更新工号
        personDao.updateJobNumber(id, jobNumber);
        
        return person;
    }

    /**
     * 批量更新空工号
     */
    public int batchUpdateEmptyJobNumbers() {
        return personDao.batchUpdateEmptyJobNumbers();
    }

    /**
     * 获取部门缩写
     */
    private String getDepartmentAbbr(String department) {
        switch (department) {
            case "表面处理车间": return "BM";
            case "锻压车间": return "DY";
            case "组装车间": return "ZZ";
            case "质检车间": return "ZJ";
            case "机加车间": return "JJ";
            default: return "QT"; // 其他情况
        }
    }

    /**
     * 更新人员信息
     */
    public boolean updatePerson(Person person) {
        // 如果工号为空，获取原有人员信息的工号
        if (person.getJobNumber() == null || person.getJobNumber().isEmpty()) {
            Person existingPerson = personDao.getPersonById(person.getId());
            if (existingPerson != null) {
                person.setJobNumber(existingPerson.getJobNumber());
            } else {
                // 如果找不到原有人员，根据部门生成新工号
                String deptAbbr = getDepartmentAbbr(person.getDepartment());
                String jobNumber = deptAbbr + person.getId();
                person.setJobNumber(jobNumber);
            }
        }
        return personDao.updatePerson(person) > 0;
    }

    /**
     * 删除人员
     */
    public boolean deletePerson(Long id) {
        return personDao.deletePerson(id) > 0;
    }

    /**
     * 根据ID查询人员
     */
    public Person getPersonById(Long id) {
        return personDao.getPersonById(id);
    }


    /**
     * 根据员工号查询人员信息
     */
    public Person getPersonByJobNumber(String jobNumber) {
        return personDao.getPersonByJobNumber(jobNumber);
    }

    /**
     * 查询所有人员
     */
    public List<Person> getAllPersons() {
        return personDao.getAllPersons();
    }

    /**
     * 搜索人员
     */
    public List<Person> searchPersons(String keyword) {
        return personDao.searchPersons(keyword);
    }
    
    /**
     * 统计不同部门的人数
     * @return 部门名称和对应人数的键值对列表
     */
    public List<Map<String, Object>> countPersonsByDepartment() {
        List<Person> allPersons = personDao.getAllPersons();
        
        // 按部门分组并计数
        Map<String, Long> countByDepartment = allPersons.stream()
                .collect(Collectors.groupingBy(Person::getDepartment, Collectors.counting()));
        
        // 转换为前端需要的键值对列表格式
        return countByDepartment.entrySet().stream()
                .map(entry -> {
                    Map<String, Object> item = new HashMap<>();
                    item.put("name", entry.getKey());
                    item.put("value", entry.getValue());
                    return item;
                })
                .collect(Collectors.toList());
    }
    
    /**
     * 统计不同最高学历的人数
     * @return 学历名称和对应人数的键值对列表
     */
    public List<Map<String, Object>> countPersonsByEducation() {
        List<Person> allPersons = personDao.getAllPersons();
        
        // 按最高学历分组并计数
        Map<String, Long> countByEducation = allPersons.stream()
                .collect(Collectors.groupingBy(Person::getEducation, Collectors.counting()));
        
        // 转换为前端需要的键值对列表格式
        return countByEducation.entrySet().stream()
                .map(entry -> {
                    Map<String, Object> item = new HashMap<>();
                    item.put("name", entry.getKey());
                    item.put("value", entry.getValue());
                    return item;
                })
                .collect(Collectors.toList());
    }
    
    /**
     * 统计不同职称的人数
     * @return 职称名称和对应人数的键值对列表
     */
    public List<Map<String, Object>> countPersonsByTitle() {
        List<Person> allPersons = personDao.getAllPersons();
        
        // 按职称分组并计数
        Map<String, Long> countByTitle = allPersons.stream()
                .collect(Collectors.groupingBy(Person::getTitle, Collectors.counting()));
        
        // 转换为前端需要的键值对列表格式
        return countByTitle.entrySet().stream()
                .map(entry -> {
                    Map<String, Object> item = new HashMap<>();
                    item.put("name", entry.getKey());
                    item.put("value", entry.getValue());
                    return item;
                })
                .collect(Collectors.toList());
    }
}
